In this notebook, we show that the infinite family of pairs of Legendrian knots with positive tb that share the same Stein trace constructed via RGB links in Theorem 1.2.(ii) are all smoothly non-isotopic.
import snappy
We load the surgery descriptions of the knots and verify their hyperbolicity.
LB=snappy.Manifold('LB.lnk')
LB.verify_hyperbolicity()[0]
LG=snappy.Manifold('LG.lnk')
LG.verify_hyperbolicity()[0]
First we confirm (for small values of n) that the surgeries are actually isometric. And in a second step we prove that the knots are not isotopic.
def all_positive(manifold):
'''
Checks if the solution type of a triangulation is positive.
'''
return manifold.solution_type() == 'all tetrahedra positively oriented'
def find_positive_triangulations(manifold,number=1,tries=100):
'''
Searches for one triangulation with a positive solution type.
(Or if number is set to a different value also for different such triangulations.)
'''
M = manifold.copy()
pos_triangulations=[]
for i in range(tries):
if all_positive(M):
pos_triangulations.append(M)
if len(pos_triangulations)==number:
return pos_triangulations
break
M.randomize()
for d in M.dual_curves(max_segments=500):
X = M.drill(d)
X = X.filled_triangulation()
X.dehn_fill((1,0),-1)
for i in range(tries):
if all_positive(X):
pos_triangulations.append(X)
if len(pos_triangulations)==number:
return pos_triangulations
break
X.randomize()
# In the closed case, here is another trick.
if all(not c for c in M.cusp_info('is_complete')):
for i in range(tries):
# Drills out a random edge
X = M.__class__(M.filled_triangulation())
if all_positive(X):
pos_triangulations.append(X)
if len(pos_triangulations)==number:
return pos_triangulations
break
M.randomize()
return pos_triangulations
def better_volume(M,index=100,try_hard=False):
'''Computes the verified volume. Returns 0 if SnapPy could not do it.'''
count=0
while count<index:
try:
return M.volume(verified=True)
except:
M.randomize()
count=count+1
if try_hard==True:
pos_triang=find_positive_triangulations(M,number=1,tries=index)
for X in pos_triang:
vol=better_volume(X,index)
if vol!=0:
return vol
return 0
def better_is_isometric_to(X,Y,index=100):
"""
Returns True if X and Y are isometric.
Returns False if X and Y have different homologies.
Returns 'unclear' if SnapPy cannot verify it.
The higher the index the harder SnapPy tries.
"""
w='unclear'
if X.homology()!=Y.homology():
w=False
if w=='unclear':
for i in (0,index):
try:
w=X.is_isometric_to(Y)
except RuntimeError:
pass
except snappy.SnapPeaFatalError:
pass
if w==True:
break
if w==False:
w='unclear'
X.randomize()
Y.randomize()
i=i+1
return w
for n in range(1,21):
LB.dehn_fill([(-7-2*n,1),(-1,n)])
LG.dehn_fill([(-3,1),(-1,n),(1,2*n+4)])
print(n,better_is_isometric_to(LB,LG))
To complete the proof of Theorem 1.2.(ii), we show that the resulting knots K_B_n and K_G_n are different for all n. For that we compute the volumes of the knots using our surgery descriptions. And use the result that the volumes of the families converge monotonically to the volume of the surgery link. So we first compute the volumes of the surgery links and then check how the volumes of the families converge to this value.
LB.dehn_fill([(0,0),(0,0)])
better_volume(LB)
LG.dehn_fill([(0,0),(0,0),(0,0)])
better_volume(LG)
for n in range(1,20):
LB.dehn_fill([(0,0),(-1,n)])
LG.dehn_fill([(0,0),(-1,n),(1,2*n+4)])
print('n=',n)
print('Volume of K_B_n=',better_volume(LB))
print('Volume of K_G_n=',better_volume(LG))
This proves that all the pairs are not isotopic and thus finishes the proof of Theorem 1.2.(ii).